package com.example.onlineeducation.widget.marquee

import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.ViewFlipper
import androidx.annotation.LayoutRes
import com.example.onlineeducation.R

//带有自动轮播效果的ViewFlipper
class MarqueeViewFlipper : ViewFlipper {
    private var mAdapter: MarqueeAdapter<*>? = null
    private var mLayoutId = 0

    constructor(context: Context?) : super(context)
    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
        val typedArray = context.obtainStyledAttributes(attrs, R.styleable.MarqueeViewFlipper)
        mLayoutId = typedArray.getResourceId(R.styleable.MarqueeViewFlipper_layout_id, 0)
        if (mLayoutId != 0) {
            val view = LayoutInflater.from(context).inflate(mLayoutId, this, false)
            this.addView(view)
            this.postInvalidate() //刷新界面
        }
        typedArray.recycle()
    }

    fun setAdapter(adapter: MarqueeAdapter<*>?): MarqueeViewFlipper { //设置适配器
        return if (null == adapter) {
            throw NullPointerException("adapter is null !!")
        } else {
            mAdapter = adapter
            this
        }
    }

    /**
     * 添加视图到轮播中
     * itemLayoutId 有两种设置方式：
     * 1、[MarqueeAdapter.getItemLayoutId]，如果轮播中有不同的布局需求，可以重写这个方法
     * 2、xml中使用 {app:itemLayout} 或者 [.setItemLayoutId] 注：所有的布局都会使用同一个布局
     * 注：如果同时使用1的优先级大于2
     */
    private fun addView() {
        removeAllViews()
        val itemCount = mAdapter!!.itemCount
        for (i in 0 until itemCount) {
            val formAdapterItemLayout = mAdapter!!.getItemLayoutId(i)
            if (formAdapterItemLayout != 0) mLayoutId = formAdapterItemLayout
            if (mLayoutId != 0) {
                val view = LayoutInflater.from(context).inflate(mLayoutId, this, false)
                mAdapter!!.bind(view, i)
                addView(view)
            }
        }
    }

    fun setItemLayoutId(@LayoutRes layoutId: Int) { //设置视图布局id
        mLayoutId = layoutId
    }

    override fun startFlipping() { //保证至少两个的视图才开始轮播
        addView()
        if (childCount > 1) super.startFlipping()
    }
}